package viper0

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

/**
		在构建现代应用程序时，您不必担心配置文件格式; 你可以专注于构建出色的软件。
		Viper 可以做如下工作：

		加载并解析JSON、TOML、YAML、HCL 或 Java properties 格式的配置文件
		可以为各种配置项设置默认值
		可以在命令行中指定配置项来覆盖配置值
		提供了别名系统，可以不破坏现有代码来实现参数重命名
		可以很容易地分辨出用户提供的命令行参数或配置文件与默认相同的区别
		Viper读取配置信息的优先级顺序，从高到低，如下：

		显式调用Set函数
		命令行参数
		环境变量
		配置文件
		key/value 存储系统
		默认值
		Viper 的配置项的key不区分大小写。
*/


func loadFile(){
	viper.SetConfigName("dbConfig") //  设置配置文件名 (不带后缀)
	viper.AddConfigPath("/workspace/appName/")   // 第一个搜索路径
	viper.AddConfigPath("/workspace/appName1")  // 可以多次调用添加路径
	viper.AddConfigPath(".")               // 比如添加当前目录
	err := viper.ReadInConfig() // 搜索路径，并读取配置数据
	if err != nil {
		panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}




	fmt.Println(viper.Get("app_name"))
	fmt.Println(viper.Get("log_level"))

	fmt.Println("mysql ip: ", viper.Get("mysql.ip"))
	fmt.Println("mysql port: ", viper.Get("mysql.port"))
	fmt.Println("mysql user: ", viper.Get("mysql.user"))
	fmt.Println("mysql password: ", viper.Get("mysql.password"))
	fmt.Println("mysql database: ", viper.Get("mysql.database"))

	fmt.Println("redis ip: ", viper.Get("redis.ip"))
	fmt.Println("redis port: ", viper.Get("redis.port"))
}


func watchNotify(){
	/*
	Viper支持让你的应用程序在运行时拥有读取配置文件的能力。
	只需要调用viper实例的WatchConfig函数，你也可以指定一个回调函数来获得变动的通知。
	 */
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		fmt.Println("Config file changed:", e.Name)
	})


}



func Run() {


}
